package com.framework.common.util.reflect;

import com.framework.common.util.other.NumeralUtil;
import org.apache.commons.lang3.StringUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/**
 * @author 龘鵺
 * @className com.framework.web.config.dataDictConfig.handler
 * @description 反射工具类. 提供调用get/set方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
 * @datetime 2025-01-09 11:11:11
 * @version 1.0
 */
public class ReflectUtil {

    /**
     * @param obj          1 反射对象
     * @param propertyName 2 参数名
     * @return E 返回内容
     * @title 反射get方法
     * @description 反射get方法
     * @author 龘鵺
     * @datetime 2025-01-09 11:11:11
     */
    public static <T> T invokeGet(Object obj, String propertyName) {
        Object object = obj;
        try {
            Class clazz = obj.getClass();
            for (String item : StringUtils.split(propertyName, ".")) {
                PropertyDescriptor pd = new PropertyDescriptor(item, clazz);
                Method getMethod = pd.getReadMethod();//获得get方法
                object = getMethod.invoke(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) object;
    }

    /**
     * @param obj          1 反射对象
     * @param propertyName 2 参数名
     * @param value        3 注入值
     * @title 反射set方法
     * @description 反射set方法
     * @author 龘鵺
     * @datetime 2025-01-09 11:11:11
     */
    public static <T> void invokeSet(Object obj, String propertyName, T value) {
        Class clazz = obj.getClass();
        String[] names = StringUtils.split(propertyName, ".");
        try {
            for (int i = NumeralUtil.POSITIVE_ZERO; i < names.length; i++) {
                PropertyDescriptor pd = new PropertyDescriptor(names[i], clazz);
                Method setMethod = pd.getWriteMethod();//获得get方法
                setMethod.invoke(obj, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
